package com.hua.giftool.utils

import android.content.Context
import android.graphics.drawable.Drawable
import androidx.core.content.ContextCompat
import com.hua.giftool.main.application.GifApplication
import kotlin.math.roundToInt


//全局Context
inline val appContext: Context
    get() = GifApplication.instance

//dp单位
private inline val Float.dp: Float get() = this * appContext.resources.displayMetrics.density + 0.5f
private inline val Int.dp: Int get() = (this * appContext.resources.displayMetrics.density + 0.5f).roundToInt()

//资源获取
inline val Int.colorRes: Int get() = ContextCompat.getColor(appContext, this)
inline val Int.stringRes: String get() = appContext.getString(this)
inline val Int.drawableRes: Drawable? get() = ContextCompat.getDrawable(appContext, this)
inline val Int.dimenIntRes: Int get() = appContext.resources.getDimension(this).roundToInt()
inline val Int.dimenFloatRes: Float get() = appContext.resources.getDimension(this)


/**
 * 一起做同样的事情
 * @param action 动作
 * @param others 需要做同样操作的其它对象
 */
inline fun <T> T.alsoWith(vararg others: T, action: T.() -> Unit): T {
    this.action()
    others.forEach { it.action() }
    return this
}

/**
 * 一起做同样的事情
 * @param action 动作
 * @param others 需要做同样操作的其它对象
 */
inline fun <T> T.alsoWithIndexed(
    vararg others: T,
    action: (T, index: Int, isLast: Boolean) -> Unit
): T {
    mutableListOf<T>().apply {
        this.add(this@alsoWithIndexed)
        this.addAll(others)
        forEachIndexed { index, t ->
            action.invoke(t, index, index == this.size - 1)
        }
    }
    return this
}

/**
 * 判断是否都满足条件
 * @param predicate 判断表达式
 * @param others 需要做同样操作的其它对象
 */
inline fun <T> T.alsoWithAll(vararg others: T, predicate: (T) -> Boolean) =
    mutableListOf<T>().apply {
        this.add(this@alsoWithAll)
        this.addAll(others)
    }.all(predicate)

/**
 * 判断是否有满足条件
 * @param predicate 判断表达式
 * @param others 需要做同样操作的其它对象
 */
inline fun <T> T.alsoWithAny(vararg others: T, predicate: (T) -> Boolean) =
    mutableListOf<T>().apply {
        this.add(this@alsoWithAny)
        this.addAll(others)
    }.any(predicate)

/**
 * 移动List中的元素到指定位置
 */
fun <T> MutableList<T>.moveElement(fromIndex: Int, toIndex: Int) {
    // 1. 检查索引是否有效
    if (fromIndex < 0 || fromIndex >= size || toIndex < 0 || toIndex >= size) {
        throw IndexOutOfBoundsException("Invalid index: fromIndex=$fromIndex, toIndex=$toIndex, size=$size")
    }
    // 2. 如果 fromIndex 和 toIndex 相同，则无需移动
    if (fromIndex == toIndex) {
        return
    }
    // 3. 获取要移动的元素
    val element = this[fromIndex]
    // 4. 移除原位置的元素
    removeAt(fromIndex)
    // 5. 将元素插入到目标位置
    add(toIndex, element)
}